/* 
 * UnidadeOperacional.java
 * 
 * Data de criação: 05/09/2010
 * 
 * O2SOLUTIONS - SOLUÇÕES EM TECNOLOGIA DA INFORMAÇÃO. 
 *
 */
package br.com.o2solutions.siso.integration.entidade;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import br.com.o2solutions.core.integration.repository.entity.BaseEntity;

/**
 * Classe responsável por representar uma Unidade Operacional de atendimento as
 * ocorrências.
 * 
 * @author Osvaldeir
 * @since 05/09/2010
 * 
 */
@Entity
@Table(name = "TBUNIDADEOPERACIONAL")
@SequenceGenerator(name = "SQUNIDADEOPERACIONAL", sequenceName = "SQUNIDADEOPERACIONAL")
public class UnidadeOperacional extends BaseEntity<Integer> {

	private static final long serialVersionUID = 1L;

	private UnidadeOperacional unidadeComando;

	private String descricao;

	private Set<Contato> contatos;
	
	private Agente comandante;
	
	/**
	 * Retorna o(a) comandante.
	 * 
	 * @return Agente
	 */
	@ManyToOne
	@JoinColumn(name="AGENTECOMANDANTEID")
	public Agente getComandante() {
		return comandante;
	}

	/**
	 * Atribui o(a) comandante.
	 *
	 * @param comandante Agente
	 */
	public void setComandante(Agente comandante) {
		this.comandante = comandante;
	}

	/**
	 * Retorna o(a) unidadeComando.
	 * 
	 * @return {@link UnidadeOperacional}
	 */
	@ManyToOne
	@JoinColumn(name = "UNIDADECOMANDOID", nullable = true)
	public UnidadeOperacional getUnidadeComando() {
		return unidadeComando;
	}

	/**
	 * Atribui o(a) unidadeComando.
	 * 
	 * @param unidadeComando
	 *            {@link UnidadeOperacional}
	 */
	public void setUnidadeComando(UnidadeOperacional unidadeComando) {
		this.unidadeComando = unidadeComando;
	}

	@Id
	@Override
	@Column(name = "UNIDADEOPERACIONALID")
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SQUNIDADEOPERACIONAL")
	public Integer getId() {
		return super.getId();
	}

	/**
	 * Retorna o(a) descricao.
	 * 
	 * @return String
	 */
	@Column(name = "DESCRICAO", length = 50, nullable = false)
	public String getDescricao() {
		return descricao;
	}

	/**
	 * Atribui o(a) descricao.
	 * 
	 * @param descricao
	 *            String
	 */
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	/**
	 * Retorna o(a) contatos.
	 * 
	 * @return Set<Contato>
	 */
	@ManyToMany(cascade = CascadeType.ALL)
	@JoinTable(name = "RLUNIDADEOPERACIONALCONTATO", joinColumns = { @JoinColumn(name = "UNIDADEOPERACIONALID") }, inverseJoinColumns = { @JoinColumn(name = "CONTATOID") })
	public Set<Contato> getContatos() {
		if (contatos == null) {
			contatos = new HashSet<Contato>();
		}

		return contatos;
	}

	/**
	 * Atribui o(a) contatos.
	 * 
	 * @param contatos
	 *            Set<Contato>
	 */
	public void setContatos(Set<Contato> contatos) {
		this.contatos = contatos;
	}

	/**
	 * Adiciona um contato a Unidade Operacional. Caso este já esteja cadastrado
	 * ou seja nulo nada é feito.
	 * 
	 * @param contato
	 */
	public void adicionarContato(Contato contato) {
		if (contato != null) {
			getContatos().add(contato);
		}
	}
}
